home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 January: Mac OS SDK / Dev.CD Jan 96 SDK / Dev.CD Jan 96 SDK1.toast / Development Kits (Disc 1) / AOCE / Development Tools / Sample Code / Messaging Service Access Module / Internet PMSAM / Internet PMSAM source / network.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-10-07  |  7.2 KB  |  342 lines  |  [TEXT/MPS ]

  1. /*-------------------------------------------------------------------
  2.  
  3. AOCE Post Office Protocol (POP) / Simple Mail Transfer Protocol (SMTP)
  4. Mail Service Access Module
  5.  
  6. written by Steve Falkenburg-- MacDTS
  7. ©1991-1993 Apple Computer, Inc.
  8.  
  9. --------------
  10. change history
  11. --------------
  12.  
  13. SJF        02/19/93    update for beta build    b1
  14. SJF        10/29/92    update to a11            a11
  15. SJF        06/08/92    update to a8            a8
  16. SJF        02/15/92    first working version    a4.5
  17. SJF        10/16/91    initial coding            a3
  18.  
  19. ---------------------------------------------------------------------*/
  20.  
  21. #ifndef __TYPES__
  22. #include <Types.h>
  23. #endif
  24.  
  25. #ifndef __DEVICES__
  26. #include <Devices.h>
  27. #endif
  28.  
  29. #include <MacTCPCommonTypes.h>
  30. #include <TCPPB.h>
  31. #include <GetMyIPAddr.h>
  32. #include <AddressXLation.h>
  33.  
  34. #include "const.h"
  35. #include "gwerrors.h"
  36. #include "mytypes.h"
  37. #include "globals.h"
  38. #include "utils.h"
  39.  
  40. #include "network.h"
  41.  
  42. #define    kTCPDriverName            "\p.ipp"
  43. #define    kByteBufferSize            8192L
  44. #define    kConnectionBufferSize    16384L
  45. #define    kValidityFlags            0xC0
  46.     
  47. /* static globals */
  48.  
  49. static short gTCPDrvrRef;
  50. static Ptr gByteBuffer = nil;
  51. static unsigned short gBBLength = 0;
  52. static unsigned short gBBOffset = 0;
  53.  
  54. typedef struct MyTCPiopb {
  55.     unsigned long saveA5;
  56.     TCPiopb pb;
  57. } MyTCPiopb;
  58.  
  59. void TCPCompletion(struct TCPiopb *iopb);
  60.  
  61.  
  62. OSErr InitRemoteNetStuff(void)
  63. {
  64.     OSErr err;
  65.     unsigned long ourAddress;
  66.     
  67.     if (gNetworkInited)
  68.         return noErr;
  69.         
  70.     err = OpenDriver(kTCPDriverName,&gTCPDrvrRef);
  71.     if (err!=noErr)
  72.         return kMacTCPNotAvailable;
  73.             
  74.     err = TCP_GetMyIPAddress(&ourAddress);
  75.     if (err!=noErr)
  76.         return err;
  77.  
  78.     err = OpenResolver(nil);
  79.     if (err!=noErr)
  80.         return err;
  81.  
  82.     err = AddrToStr(ourAddress,gOurIPString);
  83.     CloseResolver();
  84.     
  85.     if (err==noErr)
  86.         gNetworkInited==true;
  87.         
  88.     return err;
  89. }
  90.  
  91.  
  92. OSErr CloseRemoteNetStuff(void)
  93. {
  94.     /* don't close the MacTCP driver! */
  95.     return noErr;
  96. }
  97.  
  98.  
  99. OSErr TCP_CreateStream(unsigned long *connID)
  100. {
  101.     MyTCPiopb iopb;
  102.     Ptr receiveBuffer;
  103.     OSErr err;
  104.     
  105.     err = InitRemoteNetStuff();
  106.     if (err!=noErr)
  107.         return err;
  108.         
  109.     receiveBuffer = NewPtrChk(kConnectionBufferSize);
  110.     if (MemError()!=noErr)
  111.         return MemError();
  112.         
  113.     iopb.saveA5 = SetCurrentA5();
  114.     iopb.pb.ioCompletion = TCPCompletion;
  115.     iopb.pb.ioCRefNum = gTCPDrvrRef;
  116.     iopb.pb.csCode = TCPCreate;
  117.     iopb.pb.csParam.create.rcvBuff = receiveBuffer;
  118.     iopb.pb.csParam.create.rcvBuffLen = kConnectionBufferSize;
  119.     iopb.pb.csParam.create.notifyProc = nil;
  120.     PBControl((ParmBlkPtr)&iopb.pb,true);
  121.     err = WaitPBDone(&iopb.pb);
  122.     
  123.     *connID = iopb.pb.tcpStream;
  124.     
  125.     return err;
  126. }
  127.  
  128.  
  129. OSErr TCP_ReleaseStream(unsigned long connID)
  130. {
  131.     MyTCPiopb iopb;
  132.     Ptr receiveBuffer;
  133.     OSErr err;
  134.     
  135.     err = InitRemoteNetStuff();
  136.     if (err!=noErr)
  137.         return err;
  138.  
  139.     iopb.saveA5 = SetCurrentA5();
  140.     iopb.pb.ioCompletion = TCPCompletion;
  141.     iopb.pb.ioCRefNum = gTCPDrvrRef;
  142.     iopb.pb.csCode = TCPRelease;
  143.     iopb.pb.tcpStream = connID;
  144.     PBControl((ParmBlkPtr)&iopb.pb,true);
  145.     err = WaitPBDone(&iopb.pb);
  146.     
  147.     if (err==noErr) {
  148.         receiveBuffer = iopb.pb.csParam.create.rcvBuff;
  149.         DisposPtrChk(receiveBuffer);
  150.         err = MemError();
  151.     }
  152.     
  153.     return err;
  154. }
  155.  
  156.  
  157. OSErr TCP_CloseConnection(unsigned long connID,char timeout)
  158. {
  159.     MyTCPiopb iopb;
  160.     OSErr err;
  161.     
  162.     err = InitRemoteNetStuff();
  163.     if (err!=noErr)
  164.         return err;
  165.  
  166.     iopb.saveA5 = SetCurrentA5();
  167.     iopb.pb.ioCompletion = TCPCompletion;
  168.     iopb.pb.ioCRefNum = gTCPDrvrRef;
  169.     iopb.pb.csCode = TCPClose;
  170.     iopb.pb.tcpStream = connID;
  171.     iopb.pb.csParam.close.ulpTimeoutValue = timeout;
  172.     iopb.pb.csParam.close.ulpTimeoutAction = 0;
  173.     PBControl((ParmBlkPtr)&iopb.pb,true);
  174.     err = WaitPBDone(&iopb.pb);
  175.  
  176.     return err;
  177. }
  178.  
  179.  
  180. OSErr TCP_ActiveOpen(unsigned long connID,unsigned long ipAddress,unsigned short ipPort,char timeout)
  181. {
  182.     MyTCPiopb iopb;
  183.     OSErr err;
  184.     
  185.     err = InitRemoteNetStuff();
  186.     if (err!=noErr)
  187.         return err;
  188.  
  189.     iopb.saveA5 = SetCurrentA5();
  190.     iopb.pb.ioCompletion = TCPCompletion;
  191.     iopb.pb.ioCRefNum = gTCPDrvrRef;
  192.     iopb.pb.csCode = TCPActiveOpen;
  193.     iopb.pb.tcpStream = connID;
  194.     iopb.pb.csParam.open.ulpTimeoutValue = timeout;
  195.     iopb.pb.csParam.open.ulpTimeoutAction = 1;
  196.     iopb.pb.csParam.open.validityFlags = kValidityFlags;
  197.     iopb.pb.csParam.open.commandTimeoutValue = timeout;
  198.     iopb.pb.csParam.open.remoteHost = ipAddress;
  199.     iopb.pb.csParam.open.remotePort = ipPort;
  200.     iopb.pb.csParam.open.localHost = 0L;
  201.     iopb.pb.csParam.open.localPort = 0;
  202.     iopb.pb.csParam.open.tosFlags = 0;
  203.     iopb.pb.csParam.open.precedence = 0;
  204.     iopb.pb.csParam.open.dontFrag = 0;
  205.     iopb.pb.csParam.open.timeToLive = 0;
  206.     iopb.pb.csParam.open.security = 0;
  207.     iopb.pb.csParam.open.optionCnt = 0;
  208.     PBControl((ParmBlkPtr)&iopb.pb,true);
  209.     err = WaitPBDone(&iopb.pb);
  210.  
  211.     return err;
  212. }
  213.  
  214.  
  215. OSErr TCP_Send(unsigned long connID,char *sendData,unsigned short sendLength,Boolean push,char timeout)
  216. {
  217.     OSErr err;
  218.     struct wdsEntry myWDS[2];
  219.     MyTCPiopb iopb;
  220.     
  221.     err = InitRemoteNetStuff();
  222.     if (err!=noErr)
  223.         return err;
  224.  
  225.     myWDS[0].length = sendLength;
  226.     myWDS[0].ptr = sendData;
  227.     myWDS[1].length = 0;
  228.     myWDS[1].ptr = nil;
  229.  
  230.     iopb.saveA5 = SetCurrentA5();
  231.     iopb.pb.ioCompletion = TCPCompletion;
  232.     iopb.pb.ioCRefNum = gTCPDrvrRef;
  233.     iopb.pb.csCode = TCPSend;
  234.     iopb.pb.tcpStream = connID;
  235.     iopb.pb.csParam.send.ulpTimeoutValue = timeout;
  236.     iopb.pb.csParam.send.ulpTimeoutAction = 0;
  237.     iopb.pb.csParam.send.validityFlags = kValidityFlags;
  238.     iopb.pb.csParam.send.pushFlag = push;
  239.     iopb.pb.csParam.send.urgentFlag = false;
  240.     iopb.pb.csParam.send.wdsPtr = (Ptr)myWDS;
  241.     PBControl((ParmBlkPtr)&iopb.pb,true);
  242.     err = WaitPBDone(&iopb.pb);
  243.  
  244.     return err;
  245. }
  246.  
  247.  
  248. OSErr TCP_Receive(unsigned long connID,Ptr buffer,unsigned short *bufLen,char timeout)
  249. {
  250.     MyTCPiopb iopb;
  251.     OSErr err;
  252.     
  253.     err = InitRemoteNetStuff();
  254.     if (err!=noErr)
  255.         return err;
  256.  
  257.     iopb.saveA5 = SetCurrentA5();
  258.     iopb.pb.ioCompletion = TCPCompletion;
  259.     iopb.pb.ioCRefNum = gTCPDrvrRef;
  260.     iopb.pb.csCode = TCPRcv;
  261.     iopb.pb.tcpStream = connID;
  262.     
  263.     iopb.pb.csParam.receive.commandTimeoutValue = timeout;
  264.     iopb.pb.csParam.receive.rcvBuff = buffer;
  265.     iopb.pb.csParam.receive.rcvBuffLen = *bufLen;
  266.     PBControl((ParmBlkPtr)&iopb.pb,true);
  267.     err = WaitPBDone(&iopb.pb);
  268.  
  269.     *bufLen = iopb.pb.csParam.receive.rcvBuffLen;
  270.     return err;
  271. }
  272.  
  273.  
  274. OSErr TCP_ReadByte(unsigned long connID,unsigned char *byte,char timeout)
  275. {
  276.     OSErr err = noErr;
  277.     
  278.     /* check to see if buffer is un-allocated.  If so, make one */
  279.     
  280.     if (gByteBuffer==nil) {
  281.         gByteBuffer = NewPtrChk(kByteBufferSize);
  282.         if (MemError()!=noErr)
  283.             return MemError();
  284.         gBBLength = 0;
  285.         gBBOffset = 0;
  286.     }
  287.     
  288.     if (gBBLength==gBBOffset) {        // is the buffer empty? then fill it
  289.         gBBLength = kByteBufferSize;
  290.         gBBOffset = 0;
  291.         err = TCP_Receive(connID,gByteBuffer,&gBBLength,timeout);
  292.     }
  293.     
  294.     if (err==noErr)
  295.         *byte = gByteBuffer[gBBOffset++];
  296.     
  297.     return err;
  298. }
  299.  
  300.  
  301. OSErr TCP_FlushBytes(void)
  302. {
  303.     if (gByteBuffer)
  304.         DisposPtrChk(gByteBuffer);
  305.     gByteBuffer = nil;
  306.     gBBLength = 0;
  307.     gBBOffset = 0;
  308.     
  309.     return noErr;
  310. }
  311.  
  312.  
  313. OSErr TCP_GetMyIPAddress(unsigned long *ipAddress)
  314. {
  315.     struct GetAddrParamBlock ipBlock;
  316.     OSErr err;
  317.     
  318.     ipBlock.csCode = ipctlGetAddr;
  319.     ipBlock.ioCompletion = nil;
  320.     
  321.     ipBlock.ioCRefNum = gTCPDrvrRef;
  322.     PBControl((ParmBlkPtr)&ipBlock,false);
  323.     *ipAddress = ipBlock.ourAddress;
  324.     err = ipBlock.ioResult;
  325.     return err;
  326. }
  327.  
  328.  
  329. void TCPCompletion(TCPiopb *iopb)
  330. {
  331.     MyTCPiopb *myBlock;
  332.     long saveA5;
  333.  
  334.     myBlock = (MyTCPiopb *) (((char *)iopb)-4);
  335.     saveA5 = SetA5(myBlock->saveA5);
  336.  
  337.     gWakeUpSecondary = true;    // set a flag to make sure we affect the next WaitNextEvent...
  338.     WakeUpProcess(&gOurPSN);    
  339.  
  340.     SetA5(saveA5);
  341. }
  342.